package database

import (
	"fmt"

	"game-simple/internal/framework/auth/models"
)

// AutoMigrate 自动迁移所有模型
func AutoMigrate() error {
	db := GetDB()
	if db == nil {
		return fmt.Errorf("数据库未初始化")
	}

	// 注册所有需要迁移的模型
	migrateModels := []interface{}{
		&models.UserModel{},
		// 在这里添加更多模型
	}

	// 执行迁移
	for _, model := range migrateModels {
		if err := db.AutoMigrate(model); err != nil {
			return fmt.Errorf("迁移模型 %T 失败: %w", model, err)
		}
	}

	return nil
}

// RegisterModel 注册需要迁移的模型（供外部模块使用）
var registeredModels []interface{}

// RegisterModels 注册多个模型
func RegisterModels(models ...interface{}) {
	registeredModels = append(registeredModels, models...)
}

// MigrateRegisteredModels 迁移所有注册的模型
func MigrateRegisteredModels() error {
	db := GetDB()
	if db == nil {
		return fmt.Errorf("数据库未初始化")
	}

	if len(registeredModels) == 0 {
		return nil
	}

	for _, model := range registeredModels {
		if err := db.AutoMigrate(model); err != nil {
			return fmt.Errorf("迁移模型 %T 失败: %w", model, err)
		}
	}

	return nil
}

// GetTables 获取所有已存在的表名
func GetTables() ([]string, error) {
	db := GetDB()
	if db == nil {
		return nil, fmt.Errorf("数据库未初始化")
	}

	var tables []string
	if err := db.Raw("SHOW TABLES").Scan(&tables).Error; err != nil {
		return nil, fmt.Errorf("获取表列表失败: %w", err)
	}

	return tables, nil
}

// TableExists 检查表是否存在
func TableExists(tableName string) (bool, error) {
	db := GetDB()
	if db == nil {
		return false, fmt.Errorf("数据库未初始化")
	}

	var count int64
	err := db.Raw("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?", tableName).Scan(&count).Error
	if err != nil {
		return false, fmt.Errorf("检查表是否存在失败: %w", err)
	}

	return count > 0, nil
}

